home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / NewRandom.st < prev    next >
Text File  |  1993-07-24  |  4KB  |  140 lines

  1. "    NAME        NewRandom
  2.     AUTHOR        tph@cs.man.ac.uk
  3.     FUNCTION improved random generator 
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    NewRandom
  11.     provided an alternative random number generator that
  12.    makes better use of the machine's integer arithmetic (and is not
  13.    much slower---sales plug).(2.2). TPH
  14. "!
  15. 'From Smalltalk-80, version 2, of April 1, 1983 on 6 April 1987 at 8:51:52 pm'!
  16.  
  17. Stream subclass: #NewRandom
  18.     instanceVariableNames: 'seed a c m mm '
  19.     classVariableNames: 'ConstantA ConstantC ConstantM '
  20.     poolDictionaries: ''
  21.     category: 'Numeric-Numbers'!
  22.  
  23.  
  24. !NewRandom methodsFor: 'accessing'!
  25.  
  26. contents
  27.     ^self shouldNotImplement!
  28.  
  29. next
  30.     "Answer with the next random number."
  31.  
  32.     | temp |
  33.     [seed _ c + (a * seed) bitAnd: mm.
  34.     0 = (temp _ seed / m)] whileTrue.
  35.     ^temp!
  36.  
  37. nextPut: anObject
  38.     ^self shouldNotImplement! !
  39.  
  40. !NewRandom methodsFor: 'testing'!
  41.  
  42. atEnd
  43.     ^false! !
  44.  
  45. !NewRandom methodsFor: 'private'!
  46.  
  47. setSeed
  48.     "Answer a seed value from the millisecond clock, truncated to 
  49.      the appropriate truncation constant.  Set up instance variables
  50.      (used for performance reasons by the 'next' method.)"
  51.  
  52.     a _ NewRandom constantA.
  53.     c _ NewRandom constantC.
  54.     m _ NewRandom constantM asFloat.
  55.     mm _ NewRandom constantM - 1.
  56.     seed _ Time millisecondClockValue bitAnd: mm! !
  57. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  58.  
  59. NewRandom class
  60.     instanceVariableNames: ''!
  61.  
  62.  
  63. !NewRandom class methodsFor: 'instance creation'!
  64.  
  65. new
  66.     "Answer a new random number generator."
  67.  
  68.     ^self basicNew setSeed! !
  69.  
  70. !NewRandom class methodsFor: 'class access'!
  71.  
  72. constantA
  73.     ^ConstantA!
  74.  
  75. constantC
  76.     ^ConstantC!
  77.  
  78. constantM
  79.     ^ConstantM! !
  80.  
  81. !NewRandom class methodsFor: 'class initialization'!
  82.  
  83. initialize
  84.     "Initialize the class variables which are the constants  
  85.      in the linear congruent pseudo-random number generator.  
  86.       
  87.      The way to select these constants is described by D. E. Knuth  
  88.      in 'The Art of Computer Programming', Vol. 2, pages 155-156."
  89.  
  90.     | minA maxA |
  91.  
  92.     "Truncation constant is largest SmallInteger which is also a power of 2. "
  93.     ConstantM _ 2 raisedToInteger: SmallInteger maxBits - 1.
  94.  
  95.     "Additive constant is odd, and approximately the correct size."
  96.     ConstantC _ (1 / 2 - (3 sqrt / 6) * ConstantM) truncated.
  97.     ConstantC even ifTrue: [ConstantC _ ConstantC + 1].
  98.  
  99.     "Multiplicative constant is between limits and a mod 8 = 5."
  100.     minA _ (ConstantM / 100) rounded max: ConstantM sqrt rounded.
  101.     maxA _ (ConstantM - ConstantM sqrt) rounded.
  102.     ConstantA _ minA + maxA // 2.
  103.     [ConstantA \\ 8 = 5]
  104.         whileFalse: [ConstantA _ ConstantA + 1]
  105.  
  106.     "NewRandom initialize."! !
  107.  
  108. NewRandom initialize!
  109. 'From Smalltalk-80, version 2, of April 1, 1983 on 6 April 1987 at 8:51:42 pm'!
  110.  
  111.  
  112.  
  113. !SystemDictionary methodsFor: 'initialize-release'!
  114.  
  115. install
  116.     "Get connected back up to the hardware after a snapshot or quit."
  117.     "Call the initialization code that depends on system parameters,
  118.     in 
  119.     case we are coming up on a system different from the one
  120.     that we 
  121.     quit or snapshot on."
  122.  
  123.     CompiledMethod initialize.
  124.     SmallInteger initialize.
  125.     NewRandom initialize.
  126.     LargePositiveInteger initialize.
  127.     LargeNegativeInteger initialize.
  128.     DisplayScreen currentDisplay: Display.
  129.     Cursor currentCursor: Cursor currentCursor.
  130.     InputSensor install.
  131.     LowSpaceProcess == nil ifFalse: [LowSpaceProcess terminate].
  132.     LowSpaceSemaphore _ Semaphore new.
  133.     LowSpaceProcess _ [self lowSpaceNotificationLoop] newProcess.
  134.     LowSpaceProcess priority: Processor lowIOPriority.
  135.     LowSpaceProcess resume.
  136.     self resetSpaceLimits! !
  137.  
  138.     NewRandom initialize!
  139.  
  140.